// 三合一。描述如何只用一个数组来实现三个栈。

// 你应该实现push(stackNum, value)、pop(stackNum)、isEmpty(stackNum)、peek(stackNum)方法。stackNum表示栈下标，value表示压入的值。

// 构造函数会传入一个stackSize参数，代表每个栈的大小。

// 示例1:

//  输入：
// ["TripleInOne", "push", "push", "pop", "pop", "pop", "isEmpty"]
// [[1], [0, 1], [0, 2], [0], [0], [0], [0]]
//  输出：
// [null, null, null, 1, -1, -1, true]
// 说明：当栈为空时`pop, peek`返回-1，当栈满时`push`不压入元素。
// 示例2:

//  输入：
// ["TripleInOne", "push", "push", "push", "pop", "pop", "pop", "peek"]
// [[2], [0, 1], [0, 2], [0, 3], [0], [0], [0], [0]]
//  输出：
// [null, null, null, null, 2, 1, -1, -1]

#include "stdc++.h"

class TripleInOne {
public:
    TripleInOne(int stackSize) : m_stackSize(stackSize) {
        m_stack.resize(m_stackSize * 3, 0);
        m_top.resize(3, 0);
    }
    
    void push(int stackNum, int value) {
        if (m_top[stackNum] < m_stackSize) {
            m_stack[m_stackSize * stackNum + m_top[stackNum]] = value;
            ++m_top[stackNum];
        }
    }
    
    int pop(int stackNum) {
        if (m_top[stackNum] <= 0) {
            return -1;
        } else {
            --m_top[stackNum];
            return m_stack[m_stackSize * stackNum + m_top[stackNum]];
        }
    }
    
    int peek(int stackNum) {
        if (m_top[stackNum] <= 0) {
            return -1;
        } else {
            return m_stack[m_stackSize * stackNum + (m_top[stackNum] - 1)];
        }
    }
    
    bool isEmpty(int stackNum) {
        return m_top[stackNum] == 0;
    }
private:
    vector<int> m_stack{}; // 数组
    vector<int> m_top{}; // 三个栈的头指针的下标
    int m_stackSize{};
};

/**
 * Your TripleInOne object will be instantiated and called as such:
 * TripleInOne* obj = new TripleInOne(stackSize);
 * obj->push(stackNum,value);
 * int param_2 = obj->pop(stackNum);
 * int param_3 = obj->peek(stackNum);
 * bool param_4 = obj->isEmpty(stackNum);
 */